其他
再写if-else,就把你消灭
if-else的两宗罪
int a = 0;
a += 1;
a += 2;
a += 3;
if (someConditionIsMet) {
// ...
// ...
// ...
// 接下来是 100 行代码
// ...
// ...
// ...
// 还有 100 行
if (someOtherConditionIsMet) {
// ...
// ...
// ...
// 接下来是 100 行代码
// ...
// ...
// ...
if (yetAnotherConditionIsMet) {
// ...
// ...
// ...
// 接下来是 100 行代码
// ...
// ...
// ...
} else {
// 现在,处理边缘情况
}
// ...
// ...
// ...
} else {
// 现在,处理边缘情况
return someOtherResult;
}
// ...
// ...
// ...
} else {
// 现在,处理边缘情况
}
return someResult;
怎么干掉if-else
第一种方法:排非策略
if (user && password) {
// 逻辑处理
} else {
throw('用户名和密码不能为空!')
}
if (!user || !password) return throw('用户名和密码不能为空!')
// 逻辑处理
第二种方法:三元运算符
let allow = null
if(age >= 18){
allow = '通过';
} else {
allow = '拒绝';
}
// 优化后
let allow = age >= 18 ? '通过' : '拒绝'
if (flag) {
success();
} else {
fail();
}
//优化后
flag ? success() : fail();
第三种方法:使用switch、key-value和Map
if (this.type === 'A') {
this.handleA();
} else if (this.type === 'B') {
this.handleB();
} else if (this.type === 'C') {
this.handleC();
} else if (this.type === 'D') {
this.handleD();
} else {
this.handleE();
}
switch(val){
case 'A':
handleA()
break
case 'B':
handleB()
break
case 'C':
handleC()
break
case 'D':
handleD()
break
}
let enums = {
'A': handleA,
'B': handleB,
'C': handleC,
'D': handleD,
'E': handleE
}
function action(val){
let handleType = enums[val]
handleType()
}
let enums = new Map([
['A', handleA],
['B', handleB],
['C', handleC],
['D', handleD],
['E', handleE]
])
function action(val){
let handleType = enums(val)
handleType()
}
第四种方法:逻辑与运算符
if( falg ){
someMethod()
}
修改成:
falg && someMethod();
第五种方法:使用 includes 处理多重条件
if( code === '202' || code === '203' || code === '204' ){
someMethod()
}
修改成
if( ['202','203','204'].includes(code) ){
someMethod()
}
第六种方法:责任链模式和策略模式
if (!someConditionIsMet) {
// 首先处理那个边缘情况
return someResultOrNothing;
}
// 主流程可以继续,不需要额外的保护块
// ...
// ...
// ...
// 再加 100 行代码
// ...
// ...
// ...
// 还有 100 行
return someResult;
if (!someConditionIsMet) {
// 首先处理那个边缘情况
return someResultOrNothing;
}
if (!someOtherConditionIsMet) {
// 首先处理那个边缘情况
return someResultOrNothing;
}
if (!yetAnotherConditionIsMet) {
// 首先处理那个边缘情况
return someResultOrNothing;
}
// 主流程可以继续,不需要额外的保护块
// ...
// ...
// ...
// 再加 100 行代码
// ...
// ...
// ...
// 还有 100 行
return someResult;
参考文献
· END ·